package com.cc.spring.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;

public class JWTUtil {

    //秘钥加密解密都需要，所以定义成静态常量
    public static final String SIGNATURE = "cwcToken";

    public static String createToken(Map<String,String> hashMap){
        //设置一个时间，作为令牌的过期时间，设计时间为60分钟后
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.MINUTE, 60);

        //创建jwt builder
        JWTCreator.Builder builder = JWT.create();

        //遍历map集合,将信息放到payload的Claim中
        hashMap.forEach((k,v)-> builder.withClaim(k,v));

        System.out.println(calendar.getTime());
        String token = builder.withExpiresAt(calendar.getTime()) // token的过期时间
                .withSubject("subject")
                .sign(Algorithm.HMAC256(SIGNATURE)); //加密，签名

        return token;
    }

    /**
     * 验证token  DecodedJWT 为解密之后的对象 可以获取payload中添加的数据
     * @param token
     * @return
     */
    public static DecodedJWT verifyToken(String token){
        //进行token的校验,注意使用同样的算法和同样的秘钥
//        使用同样的算法解密，会验证过期时间
        return JWT.require(Algorithm.HMAC256(SIGNATURE)).build().verify(token);
    }

    /**
     * 不验证token是否过期，获取token信息
     * @param token
     * @return
     */
    public static DecodedJWT decodeToken(String token){
        return JWT.decode(token);
    }


}
